﻿using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Collections;
using csNotificaciones;

namespace MotorMetricas.Logica
{
    public class MetricaNumeroParametros : AbstractMetrica
    {
        override public int Generar(String ruta)
        {

            ManejoArchivo Manejador = new ManejoArchivo();

            ArrayList misarchivos = null;
            Boolean SinError = true;
            int NumeroParametros = 0;

            if (Manejador.ValidarRuta(ruta))
            {
                /*
                 * el metodo ObtenerArchivos devuelve el Array de strings con las direcciones
                 * de todos los archivos a evaluar, recorriendo todas las subcarpetas
                 */
                misarchivos = Manejador.ObtenerArchivos(ruta);
            }
            else
            {
                SinError = false;
                //Console.WriteLine("ERROR: Ruta invalida");
            }

            if (SinError)
            {

                foreach (String rutaArchivo in misarchivos)
                {
                    int temp = 0;
                    if (Manejador.ValidarArchivo(rutaArchivo))
                    {
                        temp = ContarNumeroParametros(rutaArchivo);
                        NumeroParametros = NumeroParametros + temp;
                    }

                }

            }
            Notificacion.mostrarVentana("Metrica de Numero de Parametros", "La metrica se ha generado con éxito\nResultado: " + NumeroParametros.ToString(), Notificacion.Imagen.Ok, 2);
            return NumeroParametros;
        }

        static public int ContarNumeroParametros(string rutaArchivo)
        {

            int numParametros = 0;
            string linea = null;
            string[] prueba = null;
            string prueba3 = null;
            int Unpar = 0;
            int noPar = 0;
            int pars = 0;
            int cantCarac = 0;

            try
            {
                StreamReader archivo = new StreamReader(rutaArchivo);

                while ((linea = archivo.ReadLine()) != null)
                {
                    if ((linea.Contains("public")) || (linea.Contains("private")))
                        if ((linea.Contains("(")) && (linea.Contains(")")))
                        {

                            prueba = linea.Split('(');
                            prueba3 = prueba[1];
                            cantCarac = prueba3.Length - 1;
                            if (prueba3.Contains(","))
                                // Parametros separados por ","
                                pars = pars + prueba3.Split(',').Length; 
                            else
                                // Se compara cada caracter con el espacio " " 
                                foreach (char i in prueba3)
                                {
                                    
                                    int convert = Convert.ToInt32(i);

                                    if ((convert != 32) && (convert != 41))
                                    {
                                        Unpar++;
                                        break;
                                    }

                                    else
                                    {
                                        
                                        if (convert == 32)
                                            noPar++;
                                    }

                                }
                            
                            numParametros = pars + Unpar;

                        }

                }

                archivo.Close();
            }
            catch (Exception)
            {
                Notificacion.mostrarVentana("Metrica de Numero de Parametros", "Ha ocurrido un error al generar esta metrica", Notificacion.Imagen.Error, 1);
            }

            return numParametros;
        }

        
    }
}
